package com.ceair.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
import org.springframework.security.oauth2.core.user.OAuth2UserAuthority;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * @author wangbaohai
 * @ClassName ClientServerConfig
 * @description: 网关作为客户端配置，主要作用是令牌中继
 * @date 2024年11月28日
 * @version: 1.0.0
 */
@Configuration
public class ClientServerConfig {

    /**
     * 创建一个GrantedAuthoritiesMapper bean，用于映射用户的权限
     * 此映射器用于从OAuth2认证服务返回的用户信息中提取并转换权限信息
     *
     * @return GrantedAuthoritiesMapper 实例，用于用户权限的映射
     */
    @Bean
    public GrantedAuthoritiesMapper userAuthoritiesMapper() {
        // 返回一个GrantedAuthoritiesMapper实现
        return (authorities) -> {
            // 初始化一个集合，用于存储映射后的权限
            Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
            // 遍历传入的权限集合
            authorities.forEach(authority -> {
                // 检查当前权限是否为OAuth2UserAuthority实例
                if (authority instanceof OAuth2UserAuthority oAuth2UserAuthority) {
                    // 从认证服务获取的用户信息中提取权限信息
                    Object userAuthorities = oAuth2UserAuthority.getAttributes().get("authorities");
                    // 如果提取到的权限信息是集合类型，则进行处理
                    if (userAuthorities instanceof Collection<?> collection) {
                        // 过滤、转换并添加权限到mappedAuthorities集合中
                        collection.stream().filter(a -> a instanceof String)
                                .map(String::valueOf)
                                .map(SimpleGrantedAuthority::new)
                                .forEach(mappedAuthorities::add);
                    }
                }
            });
            // 返回映射后的权限集合
            return mappedAuthorities;
        };
    }

}
